/**
 * Ascensor.h
 *
 */

#ifndef ASCENSOR_H_
#define ASCENSOR_H_

#include <iostream>
#include <vector>
#include <list>
#include "MemoriaCompartida/MemoriaCompartida.h"
#include "Seniales/SignalHandler.h"
#include "Semaforos/Semaforo.h"
#include "Pipes/Pipe.h"
#include "Estructuras.h"
#include "Constantes.h"
#include "Utils.h"
#include "Log.h"
#include "Persona.h"
#include "Llamada.h"

using namespace std;

class Ascensor : public EventHandler {

private:

	int velocidad;
	unsigned int capacidad;
	int cantidadPisos;
	int pisoActual;
	char modo;
	bool cumplirLlamadas;
	list<Persona> personas;
	list<Llamada> llamadas;
	MemoriaCompartida<Llamada> memComp;
	Semaforos semaforos;
	PipePersonas pipePersonas;
	vector<int> cantidadSubieron;
	vector<int> cantidadBajaron;

	void leerLlamada();
	void analizarLlamadas();
	void arriboPiso();
	bool hayLlamadaPisoAbajo();
	bool hayLlamadaPisoArriba();
	bool hayLlamadaPisoActual();
	int getTiempoEntrePisos();
	void decidirSiguienteModo();
	void bajarPersonas();
	void subirPersonas();
	void mostrarReporte();
	string getStringModo();

public:

	Ascensor( int velocidad, int capacidad, int cantidadPisos, Semaforos semaforos, PipePersonas pipePersonas );
	virtual ~Ascensor();
	int inicializar();
	void funcionar();
	int handleSignal ( int signum );

};

#endif /* ASCENSOR_H_ */
